package base.Model;

import base.Controller.SlideshowController;
import base.Main;  // 添加 Main 类的导入
import base.Util.ImageCache;
import javafx.geometry.Pos;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.ButtonType;
import javafx.scene.control.TextInputDialog;
import javafx.stage.DirectoryChooser;
import javafx.stage.Stage;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.application.Platform;
import javafx.concurrent.Task;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.List;
import java.util.Optional;
import java.util.ArrayList;
import java.util.stream.Collectors;
import javafx.scene.layout.Pane;
import javafx.geometry.Insets;
import javafx.scene.control.Dialog;
import javafx.scene.control.ButtonType;
import javafx.scene.input.MouseButton;


public class ImagePreviewPane extends VBox {
    private final File imageFile;
    private final ImageView imageView;
    private final Label nameLabel;
//    private final VBox container;
    private boolean isSelected = false;

    public ImagePreviewPane(File file) {
        this.imageFile = file;

        // 创建占位图片视图
        imageView = new ImageView();
        imageView.setFitWidth(100);
        imageView.setFitHeight(100);
        imageView.setPreserveRatio(true);

        VBox container=new VBox();
        container.setMinHeight(110);
        container.getChildren().add(imageView);
        container.setAlignment(Pos.BOTTOM_CENTER);
//        this.setMargin(imageView, new Insets(0, 0, 30, 0));
        // 创建文件名标签
        //！！！处理图片名称
        nameLabel = new Label(file.getName());
        nameLabel.setWrapText(true);
        nameLabel.setMaxWidth(100);
        nameLabel.setMaxHeight(40);
        nameLabel.setStyle("-fx-text-fill:white;");

        //test

        // 设置样式
        this.setStyle("-fx-border-color: transparent; -fx-padding: 5;");
        this.setMargin(container, new Insets(0, 0, 5, 0));
        this.setMinHeight(160); // 最小高度
        this.setPrefHeight(160); // 推荐高度
        this.setMaxHeight(160); // 最大高度（可选）

        // 添加到VBox
        getChildren().addAll(container,nameLabel);

        // 异步加载缩略图
        loadThumbnailAsync();

        // 设置鼠标事件
        setupMouseEvents();

        // 设置右键菜单
        setupContextMenu();
    }

    private void loadThumbnailAsync() {
        // 首先检查缓存
        Image cachedImage = ImageCache.getThumbnail(imageFile);
        if (cachedImage != null) {
            imageView.setImage(cachedImage);
            return;
        }

        Task<Image> loadTask = new Task<>() {
            @Override
            protected Image call() {
                return new Image(imageFile.toURI().toString(),
                        100, 100, true, true);
            }
        };

        loadTask.setOnSucceeded(event -> {
            Image thumbnail = loadTask.getValue();
            Platform.runLater(() -> imageView.setImage(thumbnail));
            ImageCache.putThumbnail(imageFile, thumbnail);
        });

        loadTask.setOnFailed(event -> {
            Platform.runLater(() -> {
                // 设置一个错误占位图
                imageView.setImage(null);
                showError("加载缩略图失败",
                        "无法加载图片: " + imageFile.getName());
            });
        });

        // 启动异步任务
        Thread thread = new Thread(loadTask);
        thread.setDaemon(true);
        thread.start();
    }

    private void setupMouseEvents() {
        setOnMouseClicked(event -> {
            if (event.getButton() == MouseButton.PRIMARY) {  // 只处理左键点击
                if (event.getClickCount() == 2) {
                    // 获取父容器(FlowPane)中的所有图片
                    List<File> imageFiles = ((Pane)getParent()).getChildrenUnmodifiable().stream()
                            .filter(node -> node instanceof ImagePreviewPane)
                            .map(node -> ((ImagePreviewPane) node).getImageFile())
                            .collect(Collectors.toList());

                    // 获取当前图片的索引
                    int startIndex = imageFiles.indexOf(imageFile);

                    try {
                        // 加载幻灯片播放窗口
                        FXMLLoader loader = new FXMLLoader(getClass().getResource("/FXML/slideshow-view.fxml"));
                        Parent root = loader.load();

                        // 配置幻灯片控制器
                        SlideshowController controller = loader.getController();
                        controller.setImageFiles(imageFiles, startIndex);

                        // 创建新窗口
                        Stage stage = new Stage();
                        stage.setTitle("幻灯片播放");
                        stage.setScene(new Scene(root));
                        stage.show();

                    } catch (IOException e) {
                        showError("打开幻灯片播放失败", e.getMessage());
                    }
                } else {
                    toggleSelect();
                }
            }
            // 右键点击不做任何处理，保留选择状态
        });
    }

    private void setupContextMenu() {
        ContextMenu contextMenu = new ContextMenu();
        // 设置上下文菜单的样式
        contextMenu.setStyle("-fx-background-color: rgb(48, 49, 48); -fx-padding: 5;");
    
        MenuItem deleteItem = new MenuItem("删除");
        MenuItem copyItem = new MenuItem("复制");
        MenuItem renameItem = new MenuItem("重命名");
    
        // 设置菜单项的样式
        deleteItem.setStyle("-fx-text-fill: white;");
        copyItem.setStyle("-fx-text-fill: white;");
        renameItem.setStyle("-fx-text-fill: white;");
    
        deleteItem.setOnAction(e -> deleteImage());
        copyItem.setOnAction(e -> copyImage());
        renameItem.setOnAction(e -> smartRename());
    
        contextMenu.getItems().addAll(deleteItem, copyItem, renameItem);
    
        // 修改右键菜单请求处理
        setOnContextMenuRequested(e -> {
            // 如果当前图片未被选中，则选中它，但不取消其他已选中的图片
            if (!isSelected) {
                setSelected(true);
            }
            contextMenu.show(this, e.getScreenX(), e.getScreenY());
            e.consume(); // 消费事件，防止传播
        });
    }

    private void deleteImage() {
        Alert alert = new Alert(AlertType.CONFIRMATION);
        alert.setTitle("确认删除");
        alert.setHeaderText("确定要删除选中的图片吗？");
        alert.setContentText("此操作不可撤销。");

        Optional<ButtonType> result = alert.showAndWait();
        if (result.isPresent() && result.get() == ButtonType.OK) {
            try {
                Files.delete(imageFile.toPath());
                ((Pane)getParent()).getChildren().remove(this);
            } catch (IOException ex) {
                showError("删除失败", "无法删除文件: " + ex.getMessage());
            }
        }
    }

    // 实现复制图片方法
    private void copyImage() {
        List<File> filesToCopy = new ArrayList<>();
        filesToCopy.add(imageFile);
        
        // 检查是否有其他选中的图片
        if (getParent() != null) {
            ((Pane)getParent()).getChildrenUnmodifiable().stream()
                .filter(node -> node instanceof ImagePreviewPane)
                .map(node -> (ImagePreviewPane) node)
                .filter(ImagePreviewPane::isSelected)
                .forEach(pane -> {
                    if (!filesToCopy.contains(pane.getImageFile())) {
                        filesToCopy.add(pane.getImageFile());
                    }
                });
        }
        
        // 调用复制到剪贴板方法
        boolean success = Main.copyFilesToClipboard(filesToCopy);
        if (success) {
            showMessage("文件已复制到剪贴板");
            // 复制成功后刷新文件夹
            // 刷新父容器
            if (getParent() != null && getParent() instanceof Pane) {
                ((Pane) getParent()).getChildren().clear();
                // 通知父容器需要重新加载
                getParent().fireEvent(new javafx.event.Event(javafx.event.Event.ANY));
            }
        } else {
            showMessage("复制失败");
        }
    }

    // 删除handleCopy方法，因为它的功能已经在copyImage中实现了

    // 智能重命名方法，根据选中图片数量决定是普通重命名还是批量重命名
    private void smartRename() {
        // 获取所有选中的图片
        List<ImagePreviewPane> selectedPanes = new ArrayList<>();
        
        if (isSelected) {
            selectedPanes.add(this);
        }
        
        if (getParent() != null) {
            ((Pane)getParent()).getChildrenUnmodifiable().stream()
                .filter(node -> node instanceof ImagePreviewPane)
                .map(node -> (ImagePreviewPane) node)
                .filter(ImagePreviewPane::isSelected)
                .forEach(pane -> {
                    if (!selectedPanes.contains(pane)) {
                        selectedPanes.add(pane);
                    }
                });
        }
        
        // 根据选中图片数量决定重命名方式
        if (selectedPanes.size() == 1) {
            // 只选中一个图片，执行普通重命名
            renameImage();
        } else if (selectedPanes.size() > 1) {
            // 选中多个图片，执行批量重命名
            batchRenameImages(selectedPanes);
        } else {
            showMessage("请先选择要重命名的图片");
        }
    }

    private void renameImage() {
        TextInputDialog dialog = new TextInputDialog(imageFile.getName());
        dialog.setTitle("重命名");
        dialog.setHeaderText("请输入新的文件名");
        dialog.setContentText("文件名:");

        Optional<String> result = dialog.showAndWait();
        if (result.isPresent()) {
            String newName = result.get();
            try {
                File newFile = new File(imageFile.getParentFile(), newName);
                Files.move(imageFile.toPath(), newFile.toPath());
                nameLabel.setText(newName);
                // 重命名成功后刷新文件夹
                // 刷新父容器
                if (getParent() != null && getParent() instanceof Pane) {
                    ((Pane) getParent()).getChildren().clear();
                    // 通知父容器需要重新加载
                    getParent().fireEvent(new javafx.event.Event(javafx.event.Event.ANY));
                }
            } catch (IOException ex) {
                showError("重命名失败", "无法重命名文件: " + ex.getMessage());
            }
        }
    }

    // 修改批量重命名方法，接受选中的图片列表作为参数
    private void batchRenameImages(List<ImagePreviewPane> selectedPanes) {
        // 如果没有选中的图片，提示用户
        if (selectedPanes.isEmpty()) {
            showMessage("请先选择要重命名的图片");
            return;
        }
        
        // 计算合适的编号位数
        int imageCount = selectedPanes.size();
        int digitCount = calculateDigitCount(imageCount);
        
        // 创建批量重命名对话框
        Dialog<ButtonType> dialog = new Dialog<>();
        dialog.setTitle("批量重命名");
        dialog.setHeaderText("请输入批量重命名的参数");
        
        // 设置对话框按钮
        dialog.getDialogPane().getButtonTypes().addAll(ButtonType.OK, ButtonType.CANCEL);
        
        // 创建表单布局
        javafx.scene.layout.GridPane grid = new javafx.scene.layout.GridPane();
        grid.setHgap(10);
        grid.setVgap(10);
        grid.setPadding(new Insets(20, 150, 10, 10));
        
        // 创建输入字段
        javafx.scene.control.TextField prefixField = new javafx.scene.control.TextField("NewName");
        javafx.scene.control.TextField startNumberField = new javafx.scene.control.TextField("1");
        javafx.scene.control.TextField digitCountField = new javafx.scene.control.TextField(String.valueOf(digitCount));
        
        // 添加到表单
        grid.add(new Label("名称前缀:"), 0, 0);
        grid.add(prefixField, 1, 0);
        grid.add(new Label("起始编号:"), 0, 1);
        grid.add(startNumberField, 1, 1);
        grid.add(new Label("编号位数:"), 0, 2);
        grid.add(digitCountField, 1, 2);
        
        dialog.getDialogPane().setContent(grid);
        
        // 显示对话框并等待用户响应
        Optional<ButtonType> result = dialog.showAndWait();
        
        if (result.isPresent() && result.get() == ButtonType.OK) {
            // 获取用户输入
            String prefix = prefixField.getText();
            int startNumber;
            int userDigitCount;
            
            try {
                startNumber = Integer.parseInt(startNumberField.getText());
                userDigitCount = Integer.parseInt(digitCountField.getText());
                
                if (startNumber < 0 || userDigitCount <= 0) {
                    showError("输入错误", "起始编号不能为负数，编号位数必须大于0");
                    return;
                }
            } catch (NumberFormatException e) {
                showError("输入错误", "起始编号和编号位数必须是整数");
                return;
            }
            
            // 执行批量重命名
            int currentNumber = startNumber;
            int successCount = 0;
            
            for (ImagePreviewPane pane : selectedPanes) {
                File oldFile = pane.getImageFile();
                String extension = oldFile.getName().contains(".") ? oldFile.getName().substring(oldFile.getName().lastIndexOf(".")) : "";
                
                // 生成新文件名，使用用户指定的位数
                String numberStr = String.format("%0" + userDigitCount + "d", currentNumber);
                String newFileName = prefix + numberStr + extension;
                
                // 创建新文件对象
                File newFile = new File(oldFile.getParentFile(), newFileName);
                
                try {
                    // 重命名文件
                    Files.move(oldFile.toPath(), newFile.toPath());
                    
                    // 更新UI
                    pane.nameLabel.setText(newFileName);
                    
                    successCount++;
                    currentNumber++;
                } catch (IOException ex) {
                    showError("重命名失败", "无法重命名文件: " + oldFile.getName() + "\n" + ex.getMessage());
                }
            }
            
            showMessage("批量重命名完成，成功重命名 " + successCount + " 个文件");
            // 批量重命名完成后刷新文件夹
            // 刷新父容器
            if (getParent() != null && getParent() instanceof Pane) {
                ((Pane) getParent()).getChildren().clear();
                // 通知父容器需要重新加载
                getParent().fireEvent(new javafx.event.Event(javafx.event.Event.ANY));
            }
        }
    }
    
    // 计算合适的编号位数
    private int calculateDigitCount(int count) {
        // 根据图片数量计算所需的位数
        // 例如：1-9需要1位，10-99需要2位，100-999需要3位
        if (count < 10) return 1;
        if (count < 100) return 2;
        if (count < 1000) return 3;
        return 4; // 默认最大支持到4位
    }

    private String generateNewFileName(File directory, String originalName) {
        String baseName = originalName.substring(0, originalName.lastIndexOf('.'));
        String extension = originalName.substring(originalName.lastIndexOf('.'));
        int counter = 1;
        String newName;
        do {
            newName = baseName + "(" + counter++ + ")" + extension;
        } while (new File(directory, newName).exists());
        return newName;
    }

    private void showError(String title, String message) {
        Alert alert = new Alert(AlertType.ERROR);
        alert.setTitle(title);
        alert.setHeaderText(null);
        alert.setContentText(message);
        alert.showAndWait();
    }
    
    // 添加显示消息的方法
    private void showMessage(String message) {
        Alert alert = new Alert(AlertType.INFORMATION);
        alert.setTitle("提示");
        alert.setHeaderText(null);
        alert.setContentText(message);
        alert.showAndWait();
    }

    public void toggleSelect() {
        isSelected = !isSelected;
        if (isSelected) {
            setStyle("-fx-border-color:rgba(153, 217, 234, 0.5); -fx-padding: 5; -fx-background-color:rgba(153, 217, 234, 0.5)");
        } else {
            setStyle("-fx-border-color: transparent; -fx-padding: 5;");
        }
        // 通知更新选中计数
        updateSelectedCount();
    }

    public File getImageFile() {
        return imageFile;
    }

    public boolean isSelected() {
        return isSelected;
    }

    public void setSelected(boolean selected) {
        isSelected = selected;
        if (isSelected) {
            setStyle("-fx-border-color:rgba(153, 217, 234, 0.5); -fx-padding: 5; -fx-background-color:rgba(153, 217, 234, 0.5)");
        } else {
            setStyle("-fx-border-color: transparent; -fx-padding: 5;");
        }
        // 通知更新选中计数
        updateSelectedCount();
    }
    
    // 添加更新选中计数的方法
    private void updateSelectedCount() {
        if (getParent() != null && getParent() instanceof Pane) {
            Pane parentPane = (Pane) getParent();
            
            // 计算选中的图片数量
            long selectedCount = parentPane.getChildrenUnmodifiable().stream()
                .filter(node -> node instanceof ImagePreviewPane)
                .map(node -> (ImagePreviewPane) node)
                .filter(ImagePreviewPane::isSelected)
                .count();
            
            // 获取总图片数量
            long totalCount = parentPane.getChildrenUnmodifiable().stream()
                .filter(node -> node instanceof ImagePreviewPane)
                .count();
            
            // 查找MainController并更新标签
            parentPane.getScene().getWindow().getProperties().forEach((key, value) -> {
                if (key.toString().equals("controller") && value instanceof Object) {
                    try {
                        Object controller = value;
                        // 使用反射调用updateSelectedCountLabel方法
                        java.lang.reflect.Method method = controller.getClass().getMethod("updateSelectedCountLabel", long.class, long.class);
                        method.invoke(controller, selectedCount, totalCount);
                    } catch (Exception e) {
                        // 反射调用失败，可能是因为方法不存在
                        System.out.println("无法更新选中计数: " + e.getMessage());
                    }
                }
            });
        }
    }
}